/**
 * 封装WebSocket类。<br>
 * 在关闭浏览器时，建议关掉webSocket连接，即设置<br/>
 * window.onbeforeunload = ()=>socket.close();
 */
class Socket {
	/**
	 * 构造方法
	 * @param url webSocket地址，以ws://开头
	 * @param noSupportFun 当浏览器不支持WebSocket类时，如果该回调方法存在，则执行，否则默认执行alert('你的浏览器不支持WebSocket')
	 */
	constructor(url, noSupportFun){
		//构造方法
		if(!url){
			throw Error('至少需要一个参数，用以指定webSocket地址');
		}
		//判断是否支持
		if('WebSocket' in window){
			//创建//WebSocket对象
			this.websocket = new WebSocket(url);
		}else if(typeof noSupportFun == 'function'){
			noSupportFun();
		}else{
			alert('你的浏览器不支持WebSocket');
		}
	}
	/**
	 * 装载方法，分别对onopen、onmessage、onclose、onerror设置处理方法。<br>
	 * message回调方法有参数event，获取服务器发送的消息，使用event.data
	 * @param open 建立WebSocket连接时的回调函数
	 * @param message 当接收到后端消息进的回调函数
	 * @param close 当关闭会话连接时的回调函数
	 * @param error 发生错误时的回调函数
	 */
	load(open, message, close, error){
		//有WebSocket对象
		if(!!this.websocket){
			//onopen
			if(typeof open == 'function') this.websocket.onopen = open;
			//onmessage
			if(typeof message == 'function') this.websocket.onmessage = message;
			//onclose
			if(typeof close == 'function') this.websocket.onclose = close;
			//onerror
			if(typeof error == 'function') this.websocket.onerror = error;
		}
	}
	/**
	 * 发送消息
	 * @param message 发送的消息，用户输入的消息内容
	 * @param toUser 接收人唯一标识userKey（如果要实现群发消息，可以传群唯一标识，后台自己根据群标识获取所有用户userKey）
	 * @param args 附加参数。按需使用，传一个对象
	 */
	send(message, toUser, args){
		//有WebSocket对象
		if(!!this.websocket){
			//参数对象
			let params = {
				message: message,
				receiver: toUser
			};
			//其它参数
			if(!!args){
				params.args = args;
			}
			//发送消息
			this.websocket.send(JSON.stringify(params));
		}
	}
	/**
	 * 关闭webSocket
	 */
	close(){
		//有WebSocket对象
		if(!!this.websocket){
			this.websocket.close();
		}
	}
}